from decimal import *
from _decimal import Decimal
from math import log


def my_sqrt(precision=20):
    """用牛顿迭代法计算 2 的算术平方根，并指定精度
    :参数 precision:  平方根精度，默认为小数点后100位
    :返回值:          返回计算结果

    示例：

    >>> my_sqrt(20)
    1.41421356237309504880

    """
    value = 2 # value为被开方的数
    next_value = value/2.0
    threshold = 10**(-precision)

    while True:
        # Decimal函数用户python进行高精度运算
        last_value = Decimal((next_value + value/next_value )/2)  # 牛顿迭代法公式
        # 如果计算值少于设定的阈值，则认为找到了正确的结果
        if abs(Decimal(last_value) - Decimal(next_value)) < threshold:
            return Decimal(last_value)
        next_value = Decimal(last_value)


the_value = 2      #  2 为默认要计算的开方数
the_precision = int(input("本代码输出根号2的近似值，\n请手动输入精度（精确到小数点后几位）："))
getcontext().prec = the_precision + int(log(the_value, 10)//2) + 1
a = my_sqrt(the_precision)

print(f"{the_value} 的算术平方根约为：{a}")
